package com.b2mining.daemons;

import java.text.SimpleDateFormat;
import java.util.*;import java.io.*;import javax.mail.*;import javax.mail.internet.*;import javax.activation.*;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

import com.b2mining.integration.beans.Empresa;
import com.b2mining.integration.controllers.XMLEmpresasController;
import com.b2mining.integration.helper.Constantes;
import com.b2mining.integration.helper.EnviarMail;
import com.b2mining.integration.helper.Helper;
import com.b2mining.integration.mq.MQAttributes;
import com.b2mining.integration.mq.MQConn;
import com.ibm.mq.MQC;
import com.ibm.mq.MQException;

/**
 * Clase encargada de iniciar la recepcion de mensajes enviados por B2MINING para los tres procesos.
 * Esta clase lanza hilos de ejecucion de la clase MQReader.
 * @since (7/4/2003 1:12:20 PM)
 * @author Ebiz Latin America <BR>
 * Analistas Programadores: Richard Linares
 */
public class MQController extends Thread {
	
	Logger log = Logger.getLogger(this.getClass());
    static String mqQM;
    static String server;
    static String channel;
    static String queue_in;
    static String queue_out;
    static String queue_in_guia_factura;
    static String queue_out_guia_factura;
    static int guiasyfacturas;
    static int tiempoEspera ;
    static int mqPort ;
    static String queue_in_acuse;
    static String queue_out_acuse;
    static int acuse;
    static String queue_in_safi;
    static String queue_out_safi;
    static int safi;
    static String empresa;
    XMLEmpresasController empController;
    static int[] banderas=null;
    private static MQController controller;
    
    //LOG
    public static String fileLog = System.getProperty("user.dir")+"\\log\\logFile.log";

    // variables de Logging
    static SimpleDateFormat dateFormatter = new SimpleDateFormat("(dd-MM-yyyy  hh:mm:ss)") ;
    static boolean logging =true ;
    public static EnviarMail mailer=new EnviarMail();
    /**
     */
    public MQController() {
        super();
    }
    /**
     * @param name java.lang.String
     */
    public MQController(String name) {
        super(name);
    }
    public static MQController getInstance(String name){
        if(controller==null){
             controller = new MQController(name);
        }
        return controller;
   }
    
    private static MQConn getConnection(Empresa laempresa) throws MQException{
    	Logger log = Logger.getLogger(MQController.class);
        MQConn conn= null;
        try{
            MQAttributes atts = new MQAttributes();
            atts.setHostname(laempresa.getSERVIDOR());
            atts.setQManager(laempresa.getMANEJADOR());
            atts.setChannel(laempresa.getCANAL());
            atts.setQLocal(laempresa.getCOLAENTRADA());
            atts.setLocalOptions(MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_FAIL_IF_QUIESCING | MQC.MQOO_BROWSE);
            atts.setQRemote(null);
            atts.setRemoteOptions(0);
            atts.setPort(Integer.parseInt(laempresa.getPUERTO()));
            conn = new MQConn(atts);
        }
        catch(MQException e){
            log.debug("Error al conectarse a la cola de entrada : "+e,e);
            throw e;
        }
        
        return conn;
    }
    
    /**
     * Starts the application.
     * @param args an array of command-line arguments
     */
    /*public static void main(java.lang.String[] args) {
       // Insert code to start the application here.
        
        MQController mqc = new MQController("Lectura de cola de mensajes MQController");
        mqc.start();
    }*/

    void readProperties() {
        try{
        tiempoEspera = Helper.tiempo_espera_mq;

        }
        catch(Exception e){
        	e.printStackTrace();
        }
    }

    /**
     * Lanza hilos de ejecucion de la clase MQReader cada cierto tiempo configurado en
     * el archivo de propiedades.
     * Creation date: (7/3/2003 10:45:09 AM)
     */
    public void run() {  
        MQReader mqr;
        MQConn conn = null;

        if(IntegracionSFTPMultiempresa.empresas.size()>0){
        	banderas=new int[IntegracionSFTPMultiempresa.empresas.size()];
        	log.debug("banderas.length : "+banderas.length);
	        for(int x=0;x<IntegracionSFTPMultiempresa.empresas.size();x++){
	        	banderas[x]=5;
	        	log.debug("bandera["+x+"] : "+banderas[x]);
	        }
        }
        
        try {
            log.info("INICIO DE MQController");
            log.info("Ultima Modificacion: 06/04/2011");
            log.debug("Modificado por: Rhandy Muguruza");
            readProperties();
            Logger log = Logger.getLogger(this.getClass());
            log.debug("inicio LOG 4J");

            int iterador=0;
			Empresa empaux=null;
			int tryCount = 0;
            while (true){
            	try{
	                    log.debug("Se continua con la ejecucion");
	                    log.debug("''''' iterador: "+iterador);
	        			empaux=((Empresa)IntegracionSFTPMultiempresa.empresas.get(iterador));
	        			
	        			log.info(" Ejecutando para "+empaux.getRAZONSOCIAL());
        				iterador+=1;
        				if(iterador==IntegracionSFTPMultiempresa.empresas.size())
        					iterador=0;
        				
        				if(empaux.getESTADO().equalsIgnoreCase("1")){
        					log.debug("en el try ...");
    	                    conn = MQController.getConnection(empaux);
    	                    log.debug("*** valor de conn: "+conn.toString());
    	                    
    	                    if ((conn!=null) && (conn.isConnected())){
    	                        mqr = new MQReader(conn,0); 
    	                        mqr.procesa();
    	                	}
    	    	            else{
    	    	            	log.debug("tiempoEspera: "+tiempoEspera);
    	                       // Thread.sleep(tiempoEspera * 1000);
    	    	            	log.info("durmiendo por 5 minutos");
    	    	            	sleep(300000);
    	                        log.debug("iterador: "+iterador);
    	        				empaux=((Empresa)IntegracionSFTPMultiempresa.empresas.get(iterador));
    	        				log.debug(" Ejecutando para "+empaux.getRAZONSOCIAL());
    	        				iterador+=1;
    	        				if(iterador==IntegracionSFTPMultiempresa.empresas.size())
    	        					iterador=0;

    	                    	 log.debug("valor de conn: "+conn.toString());
    	                        try{
    	                            conn = MQController.getConnection(empaux);
    	                        }
    	                        catch(MQException e)
    	                        {
    	                        	log.info("durmiendo por 5 minutos");
    	                        	sleep(300000);
    	                        	log.debug("Valor de conn:"+conn);
    	                        }
    	    	            }
        				}else{
        					log.info("La empresa "+empaux.getRAZONSOCIAL()+" esta deshabilitada");
        				}   
	                    banderas[iterador]=5;
                    }
                    catch(MQException e){
                    	
                    	log.error("Error al conectarse al MQ ",e);
                    	
                    	e.printStackTrace();
                    	if (++tryCount > banderas[iterador]) {
							 tryCount = 0;
							 banderas[iterador]=banderas[iterador]*10;
							 log.debug("banderas[iterador] : "+banderas[iterador]);
			                 	try {
			                 		log.info("Eviando correo por error de conexion MQ !");
			            	        String subject = Constantes.SUBJECTCABECERAEMPRESA1+empaux.getRAZONSOCIAL()+" - "+Constantes.SUBJECTERRORMQ2;
			            	        String messages = Constantes.CUERPOERRORMQ2+empaux.getCOLAENTRADA()+" en el Queue Manager "+empaux.getMANEJADOR()+" del servidor "+empaux.getSERVIDOR()
			            						+Constantes.ERRORJAVA+e.toString();
			            	        
			            	        log.info("Subject: "+subject+" - messages: "+messages);
			            	        EnviarMail.enviandoMailError(subject,messages,"MQ","");
								} catch (Exception e2) {
									// TODO: handle exception
									e2.printStackTrace();
									log.fatal("error al enviar correo !! : "+e2.getMessage()+" - "+e2.getCause());
								}
								log.info("Correo enviado !");
							log.debug("Error en MQController.getConection "+ e.getMessage());
						}else{
							conn = null;
							log.debug("--- reintentando conectar ..." + e.getMessage());
						}
                    	log.error("->existio un error de conexion, durmiendo el MQController por 5 minutos");
						sleep(300000);
                    }finally{
                        try{
                        	log.debug("AAAAA (conn) !!!! : "+conn);
                            if (conn !=null){
                                conn.mqConnDestructor2();
                                log.debug("2222");
			                    log.debug("conn.isConnected(): "+conn.isConnected());
                                conn=null;
                            }else{
			                	log.debug("la conexion al MQ ya es nula");
			                }
                            log.debug("BBBB (conn) !!!! :"+conn);
                        }
                        catch(Exception e){
                        	e.printStackTrace();
                        }
                    }
            	log.debug("tiempo espera: "+tiempoEspera);
            	sleep(tiempoEspera * 1000);
                 mqr=null;
            } //fin del WHILE
        } // Fin del Try
        catch (InterruptedException ie) {
            log.fatal("ERROR: Terminacion de ejecucion Inesperada :" + ie);
        } 
        finally{
            try{
            	log.debug("CCCC (conn) !!!! : "+conn);
                if (conn !=null){
                    conn.mqConnDestructor2();
                    log.debug("4444");
                    log.debug("conn.isConnected(): "+conn.isConnected());
                    conn=null;
                    /*if(conn!=null)
                    	log.debug("eres una coketa, q te den q te den");*/
                }else{
                	log.debug("la conexion al MQ ya es nula");
                }
            }
            catch(Exception e){
            	e.printStackTrace();
            }
        }
        log.debug("Archivo : MQController --- Metodo : run() ---- FIN");
    } // fin del metodo RUN
}
